import axios from "axios";
import nProgress from "nprogress";
import "nprogress/nprogress.css";
import router from "@/router"; // 导入router
import store from "@/store";

// 创建axios实例
const requests = axios.create({
  baseURL: "/api",
  timeout: 20000, // 请求超时时间
});

// 添加请求拦截器
requests.interceptors.request.use(
  function (config) {
    // 1. 显示请求进度条（如NProgress）
    nProgress.start();
    let token = null;
    // 2. 添加 Authorization 头（带Bearer前缀）
    token = sessionStorage.getItem("token");
    // 方法2：如果 sessionStorage 没有，尝试从 Vuex store 获取
    if (!token && store && store.state.user && store.state.user.token) {
      token = store.state.user.token;
    }
    // 方法3：如果都没有，尝试从 localStorage 获取
    if (!token) {
      token = localStorage.getItem("token");
    }

    if (token && token !== "null" && token !== "undefined") {
      config.headers["Authorization"] = "Bearer " + token; // 规范化的Bearer格式
    } else {
      // token 不存在或无效时，清除可能的无效 token
      console.warn("Token 不存在或无效，请求将不带认证信息");
      sessionStorage.removeItem("token");
      localStorage.removeItem("token");
    }

    // 3. 添加 username 字段（从存储中获取）
    // const userInfo =
    //   sessionStorage.getItem("userInfo") || localStorage.getItem("userInfo");
    // if (username) {
    //   config.headers["username"] = userInfo.sub; // 自定义字段
    // }

    // 4. 确保 Content-Type 默认设置（避免跨域预检问题）
    if (!config.headers["Content-Type"]) {
      config.headers["Content-Type"] = "application/json";
    }

    return config;
  },
  function (error) {
    nProgress.done(); // 请求错误时关闭进度条
    // router.push("/login");
    return Promise.reject(error);
  }
);

// 添加响应拦截器
requests.interceptors.response.use(
  function (response) {
    nProgress.done();
    // 对响应数据做点什么
    const token =
      response.data?.data?.token ||
      response.headers?.Authorization ||
      response.headers?.authorization ||
      "";
    // response.headers["Authorization"] || response.headers["authorization"];
    if (token && token !== "null" && token !== "undefined") {
      sessionStorage.setItem("token", token);
      // 解析JWT的payload部分（仅当token有效时）
      if (token && typeof token === "string" && token.includes(".")) {
        try {
          const strings = token.split("."); //通过split()方法将token转为字符串数组
          if (strings.length >= 3) {
            const userInfo = JSON.parse(
              decodeURIComponent(
                escape(
                  window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/"))
                )
              )
            );
            sessionStorage.setItem("userInfo", JSON.stringify(userInfo));

            // 同时更新 Vuex store 中的用户信息
            if (store && store.commit) {
              store.commit("user/SET_USER_INFO", userInfo);
            }
          }
        } catch (error) {
          console.error("解析JWT token失败:", error);
          // 解析失败不影响整体流程
        }
      }
    }

    return response.data;
  },
  function (error) {
    nProgress.done();

    // 处理401未授权错误
    if (error.response && error.response.status === 401) {
      sessionStorage.removeItem("token");
      sessionStorage.removeItem("userInfo");
      localStorage.removeItem("token");
      // 清除 Vuex store 中的用户信息
      if (store && store.commit) {
        store.commit("user/CLEAR_USER_INFO");
      }
      router.push("/login");
    }
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

export default requests;
